package cn.mujiankeji.mbrowser.app.应用操作

import cn.mujiankeji.mbrowser.app.应用接口
import cn.mujiankeji.mbrowser.功能.广告拦截.广告拦截操作
import cn.mujiankeji.mbrowser.功能.浏览框.模型.浏览框页面配置
import cn.mujiankeji.mbrowser.功能.浏览框.模型.网络文件信息
import cn.mujiankeji.mbrowser.工具.操作.地址操作
import cn.mujiankeji.mbrowser.工具.操作.用户脚本操作
import cn.mujiankeji.mbrowser.工具.网络.网络操作
import cn.mujiankeji.mbrowser.数据.数据库.AppDatabase
import cn.mujiankeji.mbrowser.数据.数据库.DBWebsiteConfig
import cn.mujiankeji.mbrowser.数据.配置项.应用配置
import cn.mujiankeji.mbrowser.界面.小窗页.请求.请求下载窗口状态
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
import org.koin.core.context.GlobalContext

object 应用网页操作 {

    fun 取基础配置(加载地址 : String,来源地址 : String,是否为搜索进入 : Boolean,
                   自动翻译: Boolean) : 浏览框页面配置 {
        return runBlocking {
            GlobalContext.get().get<AppDatabase>()
                .网站配置().let {
                    val ql = it.获取配置(地址操作.取完整主机名(加载地址))
                    val p = 浏览框页面配置(
                        起始地址 = 加载地址,
                        来源地址 = 来源地址,
                        是否为搜索进入页 = 是否为搜索进入,
                        启用内容合规检测 = 应用配置.读取网页内容合规检测().first(),
                        启用暗色模式 = 应用配置.读取当前主题颜色().first(),
                        启用电脑模式 = 应用配置.读取强制启动电脑模式().first(),
                        启用无痕模式 = 应用配置.读取无痕模式().first(),
                        启用无图模式 = 应用配置.读取浏览框无图模式().first(),
                        启用脚本支持 = 应用配置.读取启用浏览框脚本().first(),
                        启用用户脚本 = 应用配置.读取启用用户脚本().first(),
                        启用自动翻译 = 自动翻译,
                        允许第三方Cookie  = 应用配置.读取浏览框支持第三方COOKIE().first(),
                        UA标识 = 应用配置.读取默认UA标识().first(),
                    )

                    if (ql != null){
                        更新配置(ql,p)
                    }else{
                        p
                    }
                }

        }
    }

    fun 更新配置(db : DBWebsiteConfig, 浏览框页面配置: 浏览框页面配置) : 浏览框页面配置 {
        return 浏览框页面配置.copy(
            UA标识 = db.UA,
            启用暗色模式 = db.启用暗色模式,
            启用自动翻译 = db.启用自动翻译,
            启用电脑模式 = db.启用电脑模式,
            启用无痕模式 = db.启用无痕模式,
            启用无图模式 = db.启用无图模式,
            启用脚本支持 = db.启用脚本支持,
            启用用户脚本 = db.启用用户脚本,
            启用内容合规检测 = db.启用内容合规检测,
            允许第三方Cookie = db.启用允许第三方Cookie,
        )
    }

    fun 请求下载(url: String,
                 userAgent: String?,
                 contentDisposition: String?,
                 mimetype: String?,
                 contentLength: Long){
        请求下载窗口状态(url, userAgent, contentDisposition, mimetype, contentLength)
            .显示()
    }


    fun 拦截检测(文件地址 : String, 页面地址 : String) : Boolean{
        val item = 网络文件信息(文件地址)
        item.广告过滤规则 = 广告拦截操作.匹配(文件地址, 页面地址)
        return item.广告过滤规则 != null
    }

    suspend fun 请求尝试安装脚本(地址 : String,referer : String = ""){
        withContext(Dispatchers.IO){
            // 显示全局加载对话框
            应用接口.显示加载中界面(true, "正在下载用户脚本...")

            val code = 网络操作.获取文本(地址,
                headers = HashMap<String, String>().apply {
                    if (referer.isNotEmpty()) put("Referer", referer)
                })

            // 隐藏加载对话框
            应用接口.显示加载中界面(false)

            if (code != null){
                val item = 用户脚本操作.解析(code)
                if (item.名称.isNotEmpty()){
                    // 使用用户脚本安装窗口
                    val dao = GlobalContext.get().get<AppDatabase>().用户脚本()
                    用户脚本操作.请求安装脚本(code, dao) { 成功, _ ->
                        // 不需要在这里显示任何消息，因为用户脚本安装窗口已经提供了足够的反馈
                    }
                } else {
                    应用接口.输出提示("无效的用户脚本")
                }
            } else {
                应用接口.输出提示("下载用户脚本失败")
            }
        }
    }
}